package com.ktjy.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.nio.charset.StandardCharsets;

// 自定义全局过滤器类，实现 GlobalFilter 和 Ordered 接口
@Component
public class AuthorizationGlobalFilter implements GlobalFilter, Ordered {
    // 定义过滤器的执行顺序
    @Override
    public int getOrder() {
        return -1;
    }

    // 实现过滤逻辑
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 获取请求对象
        ServerHttpRequest request = exchange.getRequest();
        // 从请求头中获取 token
        String token = request.getHeaders().getFirst("Authorization");
        System.out.println("全局过滤器执行了...检查 token 是否有效");
        // 检查 token 是否有效
        if (!isValidToken(token)) {
            // 如果 token 无效，设置响应状态码为 401 Unauthorized
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            // 构建错误响应信息
            String errorMessage = "{\"message\":\"Unauthorized:Invalid token\"}";
            System.out.println("Token 无效：" + errorMessage);
            DataBuffer buffer = exchange.getResponse().bufferFactory()
                    .wrap(errorMessage.getBytes(StandardCharsets.UTF_8));
            // 将错误信息写入响应体
            return exchange.getResponse().writeWith(Flux.just(buffer));
        }
        // 如果 token 有效，继续执行过滤器链
        return chain.filter(exchange);
    }

    // 验证 token 是否有效的方法
    private boolean isValidToken(String token) {
        // 这里简单模拟验证逻辑，实际应用中需要根据具体业务实现
        return token != null && !token.isEmpty();
    }
}